import asyncio

from playwright.sync_api import sync_playwright
from playwright.async_api import async_playwright

"""
Playwright 是微软在 2020 年初开源的新一代自动化测试工具，它的功能类似于 Selenium、Pyppeteer 等，都可以驱动浏览器进行各种自动化操作。它的功能也非常强大，对市面上的主流浏览器都提供了支持，API 功能简洁又强大

Playwright的特点
Playwright 支持当前所有主流浏览器，包括 Chrome 和 Edge（基于 Chromium）、Firefox、Safari（基于 WebKit） ，提供完善的自动化控制的 API。
Playwright 支持移动端页面测试，使用设备模拟技术可以使我们在移动 Web 浏览器中测试响应式 Web 应用程序。
Playwright 支持所有浏览器的 Headless 模式和非 Headless 模式的测试。
Playwright 的安装和配置非常简单，安装过程中会自动安装对应的浏览器和驱动，不需要额外配置 WebDriver 等。
Playwright 提供了自动等待相关的 API，当页面加载的时候会自动等待对应的节点加载，大大简化了 API 编写复杂度。

要使用 Playwright，需要 Python 3.7 版本及以上

安装playwright
pip install playwright

初始化操作:  这时候 Playwrigth 会安装 Chromium, Firefox and WebKit 浏览器并配置一些驱动，我们不必关心中间配置的过程，Playwright 会为我们配置好
playwright install

"""

"""
 Playwright 支持两种编写模式，一种是类似 Pyppetter 一样的异步模式，另一种是像 Selenium 一样的同步模式
"""

"""
 示例1 同步模式示例
"""
# with sync_playwright() as p:
#     # 创建谷歌浏览器实例
#     browser_type = p.chromium
#     # 设置无头模式返回browser对象
#     browser = browser_type.launch(headless=False)
#     # 新开tab，返回page对象
#     page = browser.new_page()
#     # 打开页面
#     page.goto('https://www.baidu.com')
#     # 截图
#     page.screenshot(path=f'files/screenshot-{browser_type.name}.png')
#     # 页面title
#     print(page.title())
#     # 关闭浏览器
#     browser.close()

"""
 示例2 异步模式示例
"""

# async def main():
#     async with async_playwright() as p:
#         browser_type = p.chromium
#         # 默认就是获取无头模式的browser对象
#         browser = await browser_type.launch()
#         page = await browser.new_page()
#         await page.goto('https://www.baidu.com')
#         await page.screenshot(path=f'files/screenshot-{browser_type.name}.png')
#         print(await page.title())
#         await browser.close()
#
# asyncio.run(main())

"""
 示例3 本身自带移动端模式器
 Playwright 另外一个特色功能就是可以支持移动端浏览器的模拟，比如模拟打开 iPhone 12 Pro Max 上的 Safari 浏览器，然后手动设置定位，并打开百度地图并截图。首先我们可以选定一个经纬度，比
 如故宫的经纬度是 39.913904, 116.39014，我们可以通过 geolocation 参数传递给 Webkit 浏览器并初始化。
"""

# with sync_playwright() as p:
#     iphone_12_pro_max = p.devices['iPhone 12 Pro Max']
#     browser = p.webkit.launch(headless=False)
#     context = browser.new_context(
#         **iphone_12_pro_max,
#         locale='zh-CN',
#         geolocation={'longitude': 116.39014, 'latitude': 39.913904},
#         permissions=['geolocation']
#     )
#     page = context.new_page()
#     page.goto('https://amap.com')
#     page.wait_for_load_state(state='networkidle')
#     page.screenshot(path='files/location-iphone.png')
#     browser.close()


"""
  示例4 关于选择器 它不仅仅支持 CSS 选择器、XPath，Playwright 还扩展了一些方便好用的规则，比如直接根据文本内容筛选，根据节点层级结构筛选等
  
  文本选择点击
  page.click("text=Log in")
  
  CSS选择器----start
  # id和class
  page.click("button")
  page.click("#nav-bar .contact-us-item")
  
  # 特定属性节点
  page.click("[data-test=login-button]")
  page.click("[aria-label='Sign in']")
  
  CSS选择器----end
  
  CSS选择器+文本匹配
  page.click("article:has-text('Playwright')")  # 选择文本中包含 Playwright 的 article 节点
  page.click("#nav-bar :text('Contact us')")  # 选择 id 为 nav-bar 节点中文本值等于 Contact us 的节点
  
  CSS选择器+节点匹配
  page.click(".item-description:has(.item-promo-banner)")  #选择 class 为 item-description 的节点，且该节点还要包含 class 为 item-promo-banner 的子节点
  page.click("input:right-of(:text('Username'))") #选择的就是一个 input 节点，并且该 input 节点要位于文本值为 Username 的节点的右侧

  XPATH匹配
  page.click("xpath=//button")  开头指定 xpath= 字符串，代表后面是一个 XPath 表达式

    
"""